package com.wlanauth.web.core;




import java.util.HashMap;
import java.util.Map;

import com.opensymphony.xwork2.util.ValueStack;

/**
 * 按json格式组织异常响应信息的Action。
 * 
 * @author zz
 * @see struts.xml
 */
public class JsonExceptionResponseAction extends BaseActionSupport {
	
	private static final long serialVersionUID = 6049387633692169937L;

	private ExceptionResult exceptionResult;
	
	// 收集应用程序异常，并生成响应包。
	public String doExceptionResponse() {
		this.logger.debug("系统运行发生异常，转换成JSON格式。");
		String msg = null;
		try {
			// 发生异常后，struts把异常信息放入ValueStack中。
			// 具体请参见：http://www.opensymphony.com/webwork/wikidocs/Exception%20Handling.html
			ValueStack vs = (ValueStack) this.request.getAttribute("struts.valueStack");
			Exception ex = (Exception) vs.findValue("exception");
			logger.error("系统异常响应:"+ex.getMessage(),ex);
//			msg = ex.toString();
			msg = ex.getMessage();
			if (msg == null) msg = ex.toString();
		}
		catch (Exception ex) {
			ex.printStackTrace();
			if (msg == null) {
				msg = "很不幸，在准备返回异常信息时又发生了其它异常，无法返回原始异常信息。下面是新的异常信息：" + ex;
			}
		}
		
		this.exceptionResult = new ExceptionResult(msg);
		
		return SUCCESS;
	}
	
	// exceptionResult
	public ExceptionResult getExceptionResult() { return this.exceptionResult; }
	
	/**
	 * 异常响应结果。
	 * 
	 * @author yangwu
	 *
	 */
	public static class ExceptionResult {
		private final String data;
		
		private ExceptionResult(String errMsg) {
			this.data = errMsg;
		}
		
		// success
		public boolean getSuccess() { return false; }
		
		// errors
		// 返回的json对象中必须含有errors属性，并且不能为null，但可以为empty，
		// 否则，actionfailed事件中没有action.failureType属性。
		public Map<String, String> getErrors() {
			return new HashMap<String, String>();
		}
		
		// errMsg
		public String getData() { return this.data; }
	}
}
